『Domain Modeling Made Functional』
https://gyazo.com/15c85c992c58636fa61efb694ef31c2c
要は関数型言語でDDDする本
英語が平易で読みやすいmrsekut.iconmrsekut.icon
この本を読むためにF#の事前知識はどれほど必要か
4章で型の説明があるので「関数型言語」の知識はなくても耐えそうだが、
実際、関数型初見マンがこれぐらいの薄い説明で納得できるのかは微妙だと思う
関数型の経験があれば4章は不要レベル
今までF#のままメモってたが意味ない無いのでできるだけhsで書こうmrsekut.icon
ただ、F#でのこれって、HSでのどれだっけ?になる場合はF#書く
実装
F#
Haskell
F#
Elm
Rust
ReasonML
いっぱいあるのは良いけど本のものを完全に実装してない感じがある
Idris
この本の中で作ろうとしているものの要件のmemo
Part I ドメインを理解する
1章
これ、のちの型でワークフローを書くことの伏線になっているのかmrsekut.icon
ユビキタス言語
2章
インタビューの過程が説明されている
Domain Expertから学んだことをDSLで表現する
個々の値の上限・下限
ワークフローを型で定義
3章
関数指向のドメインモデルのためのアーキテクチャについて
Part II ドメインモデリングをする
この本特有の言葉
choice type
直和型、Union型のこと
Haskellのnewtypeと同じ
code:fsharp
type ProductCode = ProductCode of string // ProductCodeはユビキタス言語
// こう書いているのに近い. singleのunion型
type ProductCode =
| ProductCode of string
// 利用
let productCode = ProductCode 42
ユビキタス言語を活用するために、pritimive型を逐次simple typeにする
4章 Understanding Types
F#の超基本的な型の解説
型シグネチャとか、代数的データ型とか
関数型言語を少しでもしてたら既に知っているようなこと
ドメインでの処理の流れをそのまま型で表現しちゃえばいい
code:fsharp
type PayInvoice =
UnpaidInvoid -> Payment -> Result<PaidInvoice, PaymentError>
未払い請求書があり、決済が行われたら、支払い済み請求書になる
ディレクトリ構成の話
型用のファイルと関数用のファイルを分ける
ファイル内で書く順番によって使用できなかったりするので注意
5章 Domain Modeling with Types
ドメインモデルをF#の型で表現していく
この辺は『エリック・エヴァンスのドメイン駆動設計』.iconと同じことを言っているmrsekut.icon
A Question of Identity: ValueObject p.88
A Question of Identity: Entity p.89
Aggregate
6章 Integrity and Consistency in the Domain
この辺はもう、型のみで完結できる範囲を少し超えていたりするmrsekut.icon
trustedなDomainには、IntegrityとConsistencyの2つの側面がある
この2つに分ける必然性が微妙にわからないmrsekut.icon
日本のスターバックスのレジでの非同期的な処理を例にして説明している
7章 Modeling Workflows as Pipelines
Part III Implementing the Model
8 Understanding Functions
FPの基本的なことの解説
高階関数
カリー化
F#もhsと同様に全ての関数はカリー化される
部分適用
p.154~の例って、Intを引数に取っているのに0~6しかmatchさせないことに触れてないけどそもそも嘘じゃない?例が良くないmrsekut.icon
Compositionは関数結合のこと
F#ではよく|>を使う
ほぼ既知だったので軽く読み飛ばしたmrsekut.icon
9 Implementation: Composing a Pipeline
最終的にはこういう感じで処理を書きたい
code:fs
let placeOrder unvalidatedOrder =
unvalidated0rder
|> validateOrder
|> priceOrder
|> acknowledgeOrder
|> createEvents
7章までで、各stepの型を定義したので、ここから内部を実装していく
最終的に上のように連結したいが以下のような困難が出てくるので工夫が必要
副作用の扱い
前のoutputと次のinputが異なる
別の場所から引数を取ってこないといけないケースがある
etc.
9章で副作用を無視したDIについて、10章でinput/outputの乖離の問題を扱う?
この辺はsmart constructorをちゃんと作ろうな、という話を具体例を用いてしている
まだ各stepの定義をしているだけ
次のinputのために、outputを変換する手法は紹介されている
次のinputの引数を別の場所から取ってくる方法まだなので、そのままではcomposeできない
composeする方法
Injecting Dependencies
基本は、関数の引数に関数を渡すDIをする
場所によっては、カリー化でDIする
前の節を読んでないので、個々の関数がどういうものかを知らずに読んだ
要旨はわかった気がするが、前から順に読む時に再読しても良さそうmrsekut.icon
Testing Dependencies
前章の内容を前提としたtest
The Assembled Pipeline 187(3)
Wrapping Up 190(1)
10 Implementation: Working with Errors 191(30)
Result型を使ってerrorを扱う
起きうるErrorの種類が型で明示される
Using the Result Type to Make Errors 191(1)
Explicit
Working with Domain Errors 192(4)
Chaining Result-Generating Functions 196(7)
Using bind and map in Our Pipeline 203(2)
Adapting Other Kinds of Functions to the 205(4)
Two-Track Model
Making Life Easier with Computation 209(8)
Expressions
Monads and More 217(1)
Adding the Async Effect 218(2)
Wrapping Up 220(1)
11 Serialization
Domain Type, DTO, JSON等、間の変換をする
前と同様pipelineで
型の種類ごとのDTOの表現方法を解説している
12 Persistence
Pushing Persistence to the Edges 239(5)
Command-Query Separation 244(4)
Bounded Contexts Must Own Their Data 248(2)
Storage
Working with Document Databases 250(1)
Working with Relational Databases 251(11)
Transactions 262(1)
Wrapping Up 263(2)
13 Evolving a Design and Keeping It Clean 265(20)
Change 1 Adding Shipping Charges 266(4)
Change 2 Adding Support for VIP Customers 270(3)
Change 3 Adding Support for Promotion 273(7)
Codes
Change 4 Adding a Business Hours 280(1)
Constraint
Dealing with Additional Requirements 281(1)
Changes
Wrapping Up 282(1)
Wrapping Up the Book 283(2)
Index 285
https://www.youtube.com/watch?v=srQt1NAHYC0
著者の公演
書評